package ledger

// NotifyDto 通知数据传输对象
type NotifyDto struct {
	// OrgCode 机构代码
	OrgCode string `json:"org_code,omitempty"`
	// MchID 商户号
	MchID string `json:"mch_id,omitempty"`
	// LedgerModule 账本模块
	LedgerModule string `json:"ledger_module,omitempty"`
	// Status 状态
	Status string `json:"status,omitempty"`
	// Reason 原因
	Reason string `json:"reason,omitempty"`
	// Timestamp 时间戳
	Timestamp string `json:"timestamp,omitempty"`
	// Sign 签名
	Sign string `json:"sign,omitempty"`
	// Nonce 随机数
	Nonce string `json:"nonce,omitempty"`
}

// NewNotifyDto 创建通知数据传输对象
func NewNotifyDto(notifyData map[string]interface{}) *NotifyDto {
	dto := &NotifyDto{}

	if orgCode, ok := notifyData["org_code"].(string); ok {
		dto.OrgCode = orgCode
	}
	if mchID, ok := notifyData["mch_id"].(string); ok {
		dto.MchID = mchID
	}
	if ledgerModule, ok := notifyData["ledger_module"].(string); ok {
		dto.LedgerModule = ledgerModule
	}
	if status, ok := notifyData["status"].(string); ok {
		dto.Status = status
	}
	if reason, ok := notifyData["reason"].(string); ok {
		dto.Reason = reason
	}
	if timestamp, ok := notifyData["timestamp"].(string); ok {
		dto.Timestamp = timestamp
	}
	if sign, ok := notifyData["sign"].(string); ok {
		dto.Sign = sign
	}
	if nonce, ok := notifyData["nonce"].(string); ok {
		dto.Nonce = nonce
	}

	return dto
}

// IsSuccess 判断通知是否成功
func (n *NotifyDto) IsSuccess() bool {
	return n.Status == "SUCCESS"
}

// IsFailed 判断通知是否失败
func (n *NotifyDto) IsFailed() bool {
	return n.Status == "FAILED"
}

// GetStatusDescription 获取状态描述
func (n *NotifyDto) GetStatusDescription() string {
	if n.IsSuccess() {
		return "成功"
	} else if n.IsFailed() {
		return "失败"
	} else {
		return "未知状态: " + n.Status
	}
}

// String 字符串表示
func (n *NotifyDto) String() string {
	return "NotifyDto(org_code=" + n.OrgCode + ", mch_id=" + n.MchID + ", status=" + n.Status + ", reason=" + n.Reason + ")"
}
